<?php
/**
 * Класс генерации формы
 * Принимает параметры в виде асоциативного масива:
 * data - обьект CActiveRecord
 * attributes - асоциативный масив параметров формы ключ - название редактируемого столба в таблице
 * * * type (text,select) - тип редактируемого поля
 * * * relationName - имя связи с таблицой колекций
 * * * relationField - имя поля в связаной таблице
 * @author Demianchuk Dmitro
 * @email d.demianchuk@gmail.com
 * @date 24.12.11
 * @version 1.0
 * @package adminArea.components.ATableEditor
 */
class ATableEditor extends CWidget{
	public $data;
	public $attributes;
	public $itemId = null;

	private $current;

	private function registerJsCss(){
		$assets = Yii::app()->assetManager->publish(
			Yii::getPathOfAlias('adminArea.components.ATableEditor.assets.*'), true, -1, YII_DEBUG
		);
		Yii::app()->getClientScript()->registerCssFile($assets . '/css/form.css');
		Yii::app()->getClientScript()->registerScriptFile($assets . '/js/form.js');

		$jqueryForm = Yii::app()->assetManager->publish(
			Yii::getPathOfAlias('ext.jquery.plugins.*'), true, -1, YII_DEBUG
		);
		Yii::app()->clientScript->registerScriptFile($jqueryForm . '/jquery.form.js');
	}

	public function init(){
		if($this->itemId===null){
			if(isset($_GET['id'])){
				$this->itemId = (int)$_GET['id'];
			}else{
				$this->itemId = 0;
			}
		}

		if($this->itemId!=0){
			$this->current = $this->data->findByPk($this->itemId);
		}
		$this->registerJsCss();
	}

	public function run(){
		if(isset($_POST['_formSaveId'])){
			$this->save();
		}
		$this->createForm();
	}

	/**
	 * @return void
	 */
	private function createForm(){
		$formItems = array();
		foreach($this->attributes as $k=>$v){
			$className = ucfirst($v['type']).'Input';
			Yii::import('adminArea.components.ATableEditor.Elements.'.$className.'.*');
			$objInput = new $className($v,$this->data,$this->itemId);
			$formItems[] = $objInput;
		}
		$this->render('form',array('formItems'=>$formItems));
	}

	private function save(){
		$model = $this->current;

		if($_POST['_formSaveId']==0){
			$className = get_class($this->data);
			$model = new $className;
		}
		$transaction = Yii::app()->db->beginTransaction();

		try{
			//Если есть поле position и это новый - заполним его максимальным значением + 1
			if($this->isNewRecord() && isset($model->tableSchema->columns['position'])){
				$model->position = $model->getMax('position') + 1;
			}

			//Если новый элемент
			if($this->isNewRecord()){
				if(isset($model->tableSchema->columns['position'])){
					$model->position = $model->getMax('position') + 1;
				}
				$model->id = $model->getMax('id') + 1;
			}

			foreach($this->attributes as $k=>$v){
				$className = ucfirst($v['type']).'Input';
				Yii::import('adminArea.components.ATableEditor.Elements.'.$className.'.*');
				$objInput = new $className($v,$this->data,$this->itemId);
				$model = $objInput->save($model);

			}

			if(!$model->save()){
				AMessage::add($model->getErrors(),'warning');
				//echo var_dump($model->getErrors());
			}
			$transaction->commit();
		}catch(Exception $e){
			$transaction->rollBack();
			echo $e->getMessage();
			if(YII_DEBUG){
				echo '<div>File: ' .$e->getFile() . ' Line: ' . $e->getLine() . ' Code: ' . $e->getCode() .'</div>';
			}
		}
	}

	/**
	 * @return bool
	 */
	public static function isNewRecord(){
		if(isset($_GET['id']) && $_GET['id']==0){
			return true;
		}else{
			return false;
		}
	}
}
